//package com.yunhe.device.repository.device.impl;
//
//import com.yunhe.device.domain.Neo4jCondition;
//import com.yunhe.device.domain.device.SvgNode;
//import com.yunhe.common.exception.ArgumentErrorException;
//import com.yunhe.common.util.Neo4jConditionUtil;
//import org.neo4j.ogm.model.Result;
//import org.neo4j.ogm.session.Session;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Repository;
//
//import java.util.*;
//
///**
// * 模型数据仓库自定义实现
// * @desc 模型数据仓库自定义实现
// * @author liuronglei
// */
//@Repository
//public class ModelDao {
//    @Autowired
//    private Session session;
//
//    /**
//     * 增加标签
//     * @param nodeId 节点ID
//     * @param label 标签名
//     */
//    public void addLabel(Long nodeId, String label) {
//        Map<String, Object> paramMap = new HashMap<>();
//        paramMap.put("nodeId", nodeId);
//        String cypher = "start n=node({nodeId}) match(n) set n:" + label;
//        session.query(cypher, paramMap);
//    }
//
//    /**
//     * 根据SVG编号获得所有设备列表
//     * @param svgCode SVG编号
//     */
//    public List<SvgNode> getNodeBySvgCode(String svgCode) {
//        Map<String, Object> paramMap = new HashMap<>();
//        paramMap.put("svgCode", svgCode);
//        List<SvgNode> list = new ArrayList<>();
//        String cypher = "match(n:" + svgCode + ") " +
//                "return case labels(n)[0] when {svgCode} then labels(n)[1] else labels(n)[0] end as type, n as object";
//        Result result = session.query(cypher, paramMap);
//        for (Map<String, Object> object : result) {
//            SvgNode svgNode = new SvgNode();
//            svgNode.setType((String)object.get("type"));
//            svgNode.setObject(object.get("object"));
//            list.add(svgNode);
//        }
//        return list;
//    }
//
//    /**
//     * 根据code获得对象（如有多个，取第一个）
//     * @param code 代码
//     */
//    public Map<String, Object> getObjectByCode(Long code) {
//        Map<String, Long> paramMap = new HashMap<>();
//        paramMap.put("code", code);
//        String cypher = "match(n) where n.code={code} return n";
//        Result result = session.query(cypher, paramMap);
//        Iterator<Map<String, Object>> iterator = result.iterator();
//        if (iterator.hasNext()) {
//            return iterator.next();
//        } else {
//            return null;
//        }
//    }
//
//    /**
//     * 根据code获取名称
//     * @param code 代码
//     */
//    public Map<String, Object> getTitleByCode(Long code) {
//        Map<String, Long> paramMap = new HashMap<>();
//        paramMap.put("code", code);
//        String cypher = "match(n) where n.code={code} return n.title as title";
//        Result result = session.query(cypher, paramMap);
//        Iterator<Map<String, Object>> iterator = result.iterator();
//        if (iterator.hasNext()) {
//            return iterator.next();
//        } else {
//            return null;
//        }
//    }
//
//    /**
//     * 根据code获取名称
//     * @param code 代码
//     */
//    public Map<String, Object> getTitleByLabelAndNameOrCode(String label, Optional<String> name, Optional<Long> code)
//            throws ArgumentErrorException {
//        Map<String, String> paramMap1 = new HashMap<>();
//        Map<String, Long> paramMap2 = new HashMap<>();
//        Result result;
//        String cypher = "match(n:" + label + ") where ";
//        if (name.isPresent()) {
//            cypher += "n.name={name} return n.title as title";
//            paramMap1.put("name", name.get());
//            result = session.query(cypher, paramMap1);
//        }
//        else if (code.isPresent()) {
//            cypher += "n.code={code} return n.title as title";
//            paramMap2.put("code", code.get());
//            result = session.query(cypher, paramMap2);
//        }
//        else {
//            throw new ArgumentErrorException("name或code不能为空");
//        }
//        Iterator<Map<String, Object>> iterator = result.iterator();
//        if (iterator.hasNext()) {
//            return iterator.next();
//        } else {
//            return null;
//        }
//    }
//
//    /**
//     * 根据ID获得对象（如有多个，取第一个）
//     * @param id ID
//     */
//    public Map<String, Object> getObjectById(Long id) {
//        Map<String, Long> paramMap = new HashMap<>(1);
//        paramMap.put("id", id);
//        String cypher = "start n=node({id}) return n";
//        Result result = session.query(cypher, paramMap);
//        Iterator<Map<String, Object>> iterator = result.iterator();
//        if (iterator.hasNext()) {
//            return iterator.next();
//        } else {
//            return null;
//        }
//    }
//
//    public Map<String, Object> getObjById(Long id) {
//        Map<String, Long> paramMap = new HashMap<>(1);
//        paramMap.put("id", id);
//        String cypher = "match(n)-[]-(m) where ID(n)={id} return n,m";
//        Result result = session.query(cypher, paramMap);
//        Iterator<Map<String, Object>> iterator = result.iterator();
//        if (iterator.hasNext()) {
//            return iterator.next();
//        } else {
//            return null;
//        }
//    }
//
//    /**
//     * 根据条件获取Neo4j对象
//     * @param conditions 条件列表
//     */
//    public List<SvgNode> getNodeByCondition(List<Neo4jCondition> conditions)
//            throws ArgumentErrorException {
//        Map<String, Object> paramMap = getParamMap(conditions);
//        StringBuffer cypher = new StringBuffer("match(n");
//        if (paramMap.containsKey(Neo4jConditionUtil.PARAMNAME_LABEL)) {
//            cypher.append(":" + paramMap.get(Neo4jConditionUtil.PARAMNAME_LABEL));
//        }
//        cypher.append(")");
//        int whereIndex = 0;
//        for (Neo4jCondition condition : conditions) {
//            if (Neo4jConditionUtil.PARAMNAME_LABEL.equals(condition.getParamName())) {
//                continue;
//            } else {
//                //拼接where
//                if (whereIndex == 0) {
//                    whereIndex++;
//                    cypher.append("where");
//                } else {
//                    cypher.append(" " + Neo4jConditionUtil.getFilteringStr(condition.getFilteringMode()));
//                }
//                //拼接属性字段
//                if (Neo4jConditionUtil.PARAMNAME_ID.equals(condition.getParamName())) {
//                    cypher.append(" ID(n)");
//                } else {
//                    cypher.append(" " + condition.getParamName());
//                }
//                //拼接属性条件
//                cypher.append(Neo4jConditionUtil.getFilteringStr(condition.getFilteringMode()));
//                if (condition.getMatchMode() == Neo4jConditionUtil.MATCH_MODE.LIKE) {
//                    cypher.append(".*{" + condition.getParamValue() + "}.*");
//                } else {
//                    cypher.append("{" + condition.getParamValue() + "}");
//                }
//            }
//        }
//        cypher.append(" return case labels(n)[0] when {svgCode} then labels(n)[1] else labels(n)[0] end as type, n as object");
//        Result result = session.query(cypher.toString(), paramMap);
//        List<SvgNode> list = new ArrayList<>();
//        for (Map<String, Object> object : result) {
//            SvgNode svgNode = new SvgNode();
//            svgNode.setType((String)object.get("type"));
//            svgNode.setObject(object.get("object"));
//            list.add(svgNode);
//        }
//        return list;
//    }
//
//    private Map<String, Object> getParamMap(List<Neo4jCondition> conditions) {
//        Map<String, Object> paramMap = null;
//        if (conditions != null && conditions.size() > 0) {
//            paramMap = new HashMap<>();
//            for (Neo4jCondition condition : conditions) {
//                paramMap.put(condition.getParamName(), condition.getParamValue());
//            }
//        }
//        return paramMap;
//    }
//}
